package com.rul.mars.product.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.github.pagehelper.PageHelper;
import com.rul.mars.common.constant.DeleteStatusConstant;
import com.rul.mars.common.constant.RecommendStatusConstant;
import com.rul.mars.common.constant.VerifyStatusConstant;
import com.rul.mars.mbg.dao.ProductDao;
import com.rul.mars.mbg.domain.ProductCategoryNode;
import com.rul.mars.mbg.domain.ProductDetail;
import com.rul.mars.mbg.domain.ProductParam;
import com.rul.mars.mbg.domain.ProductQueryParam;
import com.rul.mars.mbg.mapper.ProductMapper;
import com.rul.mars.mbg.model.Product;
import com.rul.mars.mbg.model.ProductCategory;
import com.rul.mars.mbg.model.ProductExample;
import com.rul.mars.product.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 商品服务实现类
 *
 * @author RuL
 */
@Service
public class ProductServiceImpl implements ProductService {

    @Autowired
    private ProductMapper productMapper;

    @Autowired
    private ProductDao productDao;

    /**
     * 根据商品ID查询商品详细信息
     *
     * @param id 商品ID
     * @return 商品详细信息
     */
    @Override
    public ProductDetail detail(Long id) {
        Product product = productMapper.selectByPrimaryKey(id);
        //商品详情信息封装
        return BeanUtil.copyProperties(product, ProductDetail.class);
    }

    /**
     * 关键字搜索商品
     *
     * @param keywords 商品关键字
     * @param pageNum  页号
     * @param pageSize 页面大小
     * @param sort     排序方式
     * @return 相关商品详情
     */
    @Override
    public List<Product> search(String keywords, Integer pageNum, Integer pageSize, Integer sort) {
        //设置分页信息
        PageHelper.startPage(pageNum, pageSize);
        ProductExample example = new ProductExample();
        ProductExample.Criteria criteria = example.createCriteria();
        //未删除
        criteria.andDeleteStatusEqualTo((byte) 0);
        if (StrUtil.isNotEmpty(keywords)) {
            criteria.andKeywordsLike('%' + keywords + '%');
        }

        //排序 1->按新品 2->按销量 3->价格升序 4->价格降序
        if (sort == 1) {
            example.setOrderByClause("id desc");
        } else if (sort == 2) {
            example.setOrderByClause("sale_num desc");
        } else if (sort == 3) {
            example.setOrderByClause("sell_price asc");
        } else if (sort == 4) {
            example.setOrderByClause("sell_price desc");
        }

        return productMapper.selectByExample(example);
    }

    /**
     * 创建商品
     *
     * @param param 创建商品所需参数
     */
    @Override
    public void createProduct(ProductParam param) {
        Product product = BeanUtil.copyProperties(param, Product.class);
        //商品审核状态设置为未通过
        product.setVerifyStatus(VerifyStatusConstant.NOT_PASS);
        //商品删除状态设置为未删除
        product.setDeleteStatus(DeleteStatusConstant.NO);
        //商品推荐状态设置为不推荐
        product.setRecommendStatus(RecommendStatusConstant.NO);

        productMapper.insertSelective(product);
    }

    /**
     * 修改商品信息
     *
     * @param param 修改商品所需参数
     */
    @Override
    public void updateProduct(ProductParam param) {
        Product product = BeanUtil.copyProperties(param, Product.class);
        productMapper.updateByPrimaryKeySelective(product);
    }

    /**
     * 通过商品ID删除商品
     *
     * @param id 商品ID
     * @return 删除结果
     */
    @Override
    public boolean deleteProduct(Long id) {
        Product product = productMapper.selectByPrimaryKey(id);
        product.setDeleteStatus(DeleteStatusConstant.YES);
        int rows = productMapper.updateByPrimaryKeySelective(product);
        return rows == 1;
    }

    /**
     * 根据商品ID查询商品可修改信息
     *
     * @param id 商品ID
     * @return 商品可修改信息
     */
    @Override
    public ProductParam infoProduct(Long id) {
        Product product = productMapper.selectByPrimaryKey(id);
        return BeanUtil.copyProperties(product, ProductParam.class);
    }

    /**
     * 修改商品上下架状态
     *
     * @param id            商品ID
     * @param publishStatus 商品上下架状态（0-下架，1-上架）
     * @return 修改结果
     */
    @Override
    public boolean updatePublishStatus(Long id, Byte publishStatus) {
        Product product = productMapper.selectByPrimaryKey(id);
        product.setPublishStatus(publishStatus);
        int rows = productMapper.updateByPrimaryKeySelective(product);
        return rows == 1;
    }

    /**
     * 管理员审核商品
     *
     * @param id     商品ID
     * @param status 审核状态
     * @return 操作结果
     */
    @Override
    public boolean verifyProduct(Long id, Byte status) {
        Product product = productMapper.selectByPrimaryKey(id);
        product.setVerifyStatus(status);
        int rows = productMapper.updateByPrimaryKeySelective(product);
        return rows == 1;
    }

    /**
     * 条件查询商品信息
     *
     * @param queryParam 查询条件
     * @param pageNum    页面号
     * @param pageSize   页面大小
     * @return 符合条件的商品信息
     */
    @Override
    public List<Product> listProduct(ProductQueryParam queryParam, Integer pageNum, Integer pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        return productDao.getList(queryParam);
    }

    /**
     * 将ProductCategory转化为ProductCategoryNode
     *
     * @param category          分类信息
     * @param productCategories 所有分类信息
     * @return 转化为ProductCategoryNode的分类信息
     */
    public ProductCategoryNode covert(ProductCategory category, List<ProductCategory> productCategories) {
        //复制基本属性
        ProductCategoryNode categoryNode = BeanUtil.copyProperties(category, ProductCategoryNode.class);

        List<ProductCategoryNode> children = productCategories.stream()
                //找出子分类
                .filter(item -> item.getParentId().equals(category.getId()))
                //子分类递归转化为ProductCategoryNode
                .map(item -> covert(item, productCategories))
                .collect(Collectors.toList());
        categoryNode.setChildren(children);

        return categoryNode;
    }

}
